package controllo;

import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;

import modulo.GestoreGioco;
import modulo.Giocatore;

public class IntelligenzaArtificiale {
	private static final int TEMPO_MOSSA = 34;

	private static final int SPEED = 3;

	private GestoreGioco gestoreGioco;

	private Timer t = new Timer();

	public IntelligenzaArtificiale(GestoreGioco gestoreGioco) {
		super();
		this.gestoreGioco = gestoreGioco;
		t.schedule(new TimerTask() {

			@Override
			public void run() {
				ArrayList<Giocatore> giocatori = IntelligenzaArtificiale.this.gestoreGioco
						.getGiocatori();

				for (int i = 1; i < giocatori.size(); i++) {
					if (!giocatori.get(i).isMorto()) {
						movimentoGiocatoreVicino(i);
						int sc = (int) (Math.random() * 20 + 1);
						if (sc == 9)
							sparaGiocatoreVicino(i);
						if (sc == 10)
							IntelligenzaArtificiale.this.gestoreGioco
									.setDardoGiocatore(i,
											(int) (Math.random() * 2));
					}
				}
			}

		}, 0, TEMPO_MOSSA);
	}

	private void movimentoGiocatoreVicino(int i) {
		int index = trovaGiocatoreVicino(i);
		if (index != -1) {
			if (distanzaQuadro(gestoreGioco.getGiocatori().get(i).getX(),
					gestoreGioco.getGiocatori().get(i).getY(), gestoreGioco
							.getGiocatori().get(index).getX(), gestoreGioco
							.getGiocatori().get(index).getY()) > 40000) {
				if (gestoreGioco.getGiocatori().get(i).getX() < gestoreGioco
						.getGiocatori().get(index).getX()) {
					gestoreGioco.muoviGioc(i, GestoreGioco.RIGHT, SPEED);
				}
				if (gestoreGioco.getGiocatori().get(i).getX() > gestoreGioco
						.getGiocatori().get(index).getX()) {
					gestoreGioco.muoviGioc(i, GestoreGioco.LEFT, SPEED);
				}
				if (gestoreGioco.getGiocatori().get(i).getY() < gestoreGioco
						.getGiocatori().get(index).getY()) {
					gestoreGioco.muoviGioc(i, GestoreGioco.DOWN, SPEED);
				}
				if (gestoreGioco.getGiocatori().get(i).getY() > gestoreGioco
						.getGiocatori().get(index).getY()) {
					gestoreGioco.muoviGioc(i, GestoreGioco.UP, SPEED);
				}
			}
		}
	}

	private void sparaGiocatoreVicino(int i) {
		int index = trovaGiocatoreVicino(i);
		Giocatore target = gestoreGioco.getGiocatori().get(index);
		gestoreGioco.spara(i, target.getX() + (target.getHalfHeight()),
				target.getY() + (target.getHalfHeight()));
	}

	private int trovaGiocatoreVicino(int i) {
		int index = -1;
		float dmin = 25000000;
		int x = gestoreGioco.getGiocatori().get(i).getX();
		int y = gestoreGioco.getGiocatori().get(i).getY();
		for (int j = 0; j < gestoreGioco.getGiocatori().size(); j++) {
			if (i != j
					&& gestoreGioco.getGiocatori().get(j).getSquadra()
							.getNumero() != gestoreGioco.getGiocatori().get(i)
							.getSquadra().getNumero()) {
				if (!gestoreGioco.getGiocatori().get(j).isMorto()) {
					float d = distanzaQuadro(x, y, gestoreGioco.getGiocatori()
							.get(j).getX(), gestoreGioco.getGiocatori().get(j)
							.getY());
					if (d < dmin) {
						dmin = d;
						index = j;
					}
				}
			}
		}
		return index;
	}

	private int distanzaQuadro(int x, int y, int x2, int y2) {
		return (x - x2) * (x - x2) + (y - y2) * (y - y2);
	}
}
